home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
fourier.bas
< prev
next >
Wrap
BASIC Source File
|
1985-04-15
|
4KB
|
124 lines
2 '***********************************************************************
4 '* FOURIER SMOOTHING WITHOUT THE FAST FOURIER TRANSFORM PROGRAM *
6 '* By Eric E. Aubanel and Keith B. Oldham *
8 '***********************************************************************
10 CLS
12 INPUT "ENTER NUMBER OF DATA POINTS";N
14 REM LEAVING R AND I ARRAYS UNDIMENSIONED LIMITS VALID VALUES OF E TO <=10
16 DIM X(N),X1(N),U(N),V(N)
18 FOR I=0 TO N-1
20 INPUT "ENTER DATAPOINT VALUE";X(I)
22 NEXT I
24 GOSUB 60
26 PRINT "THE SMOOTHED DATA VALUES ARE:"
28 FOR I=0 TO N-1
30 PRINT "X(";I+1;") = ";X1(I)
32 NEXT I
34 END
36 REM FOURIER ALGORITHM SUBROUTINE BEGINS AT LINE 60. LINE NUMBERS ARE THE SAME AS FOR THE HP VERSION OF THE SUBROUTINE
60 PI=3.141593
70 PRINT "NUMBER OF TRANSFORM POINTS TO BE KEPT";
80 INPUT E
90 IF E>INT((N+1)/2) THEN PRINT "E TOO LARGE":GOTO 70
100 IF E<>INT(E) OR E<=1 THEN GOTO 70
110 IF E<=Q THEN 870
120 REM
130 IF Q<>0 THEN 330
240 'CALCULATE R(0)
250 G=0
260 FOR J=0 TO N-1
280 G=G+X(J)
290 NEXT J
300 R(0)=G/N
310 Q=1
320 REM
330 PRINT "WORKING ON R(K) TRANSFORM CALCULATIONS"
340 J2=INT((N-1)/2)
350 P1=INT(LOG(2*J2-1)/LOG(2))
360 FOR K=Q TO E-1
370 J1=J2
380 S=PI*K*2/N
390 C=COS(S):S=SIN(S)
400 FOR J=1 TO J1
410 L=2*J-1
420 U(J)=X(L)*C+X(L+1)
430 V(J)=X(L)*S
440 NEXT J
450 S=2*S*C:C=2*C*C-1
460 FOR P=1 TO P1
470 U(J1+1)=0:V(J1+1)=0
480 J1=INT((J1+1)/2)
490 FOR J=1 TO J1
500 L=2*J-1
510 U=U(L)*C-V(L)*S+U(L+1)
520 V(J)=U(L)*S+V(L)*C+V(L+1)
530 U(J)=U
540 NEXT J
550 S=2*S*C:C=2*C*C-1
560 NEXT P
570 R(K)=(X(0)+(U(1)*C+V(1)*S))/N
580 NEXT K
590 REM
600 PRINT "WORKING ON I(K) TRANSFORM CALCULATIONS"
610 FOR K=Q TO E-1
620 J1=J2
630 S=2*PI*K/N
640 C=COS(S):S=SIN(S)
650 FOR J=1 TO J1
660 L=2*J-1
670 U(J)=-(X(L)*S)
680 V(J)=X(L)*C+X(L+1)
690 NEXT J
700 S=2*S*C:C=2*C*C-1
710 FOR P=1 TO P1
720 U(J1+1)=0:V(J1+1)=0
730 J1=INT((J1+1)/2)
740 FOR J=1 TO J1
750 L=2*J-1
760 U=U(L)*C-V(L)*S+U(L+1)
770 V(J)=U(L)*S+V(L)*C+V(L+1)
780 U(J)=U
790 NEXT J
800 S=2*S*C:C=2*C*C-1
810 NEXT P
820 I(K)=-((U(1)*C+V(1)*S)/N)
830 NEXT K
840 REM
850 IF E>Q THEN Q=E
860 REM
870 PRINT "WORKING ON INVERSE TRANSFORM"
880 REM
890 'CALCULATE X1(0)
900 F1=0:F2=0
910 FOR K=1 TO E-1
920 T=R(K)
930 F1=F1+T
940 F2=F2+K*K*T
950 NEXT K
960 X1(0)=R(0)+2*(F1-F2*(1/E/E))
980 REM
990 P1=INT(LOG(2*E-3)/LOG(2))
1000 FOR J=1 TO N-1
1010 T2=E*E
1020 FOR K=1 TO E-1
1030 F=1-K*K/T2
1040 U(K)=R(K)*F:V(K)=-(I(K)*F)
1050 NEXT K
1060 K1=E-1
1070 S=2*PI*J/N
1080 C=COS(S):S=SIN(S)
1090 FOR P=1 TO P1
1100 U(K1+1)=0:V(K1+1)=0
1110 K1=INT((K1+1)/2)
1120 FOR K=1 TO K1
1130 L=2*K-1
1140 U=U(L)*C-V(L)*S+U(L+1)
1150 V(K)=U(L)*S+V(L)*C+V(L+1)
1160 U(K)=U
1170 NEXT K
1180 S=2*S*C:C=2*C*C-1
1190 NEXT P
1200 X1(J)=R(0)+2*(U(1)*C+V(1)*S)
1220 NEXT J
1230 RETURN